package com.tangbuzhi.template_method;

/**
 * 模板方法
 */
public class TemplateMethod {
    public static abstract class Computer {
        protected void powerOn() {
            System.out.println("开启电源");
        }

        protected void checkHardware() {
            System.out.println("检查硬件");
        }

        protected void loadOS() {
            System.out.println("载入操作系统");
        }

        protected void login() {
            System.out.println("用户登录，进入系统操作界面");
        }

        /*计算机启动方法，用final修饰，防止算法框架被重写*/
        public final void startUp() {
            powerOn();
            checkHardware();
            loadOS();
            login();
        }
    }

    public static class NormalComputer extends Computer {
        @Override
        protected void login() {
            System.out.println("一般用户计算机未设置登录密码，直接进入操作系统");
        }
    }

    public static class SecurityComputer extends Computer {

        @Override
        protected void checkHardware() {
            super.checkHardware();
            System.out.println("检查硬件防火墙");
        }

        @Override
        protected void login() {
            System.out.println("注重安全的计算机，需指纹识别方可进入操作系统");
        }
    }

    public static void main(String[] args) {
        Computer normal = new NormalComputer();
        normal.startUp();

        System.out.println("===========================");
        Computer security = new SecurityComputer();
        security.startUp();
        /**
         开启电源
         检查硬件
         载入操作系统
         一般用户计算机未设置登录密码，直接进入操作系统
         ===========================
         开启电源
         检查硬件
         检查硬件防火墙
         载入操作系统
         注重安全的计算机，需指纹识别方可进入操作系统
         */
    }

}
